\chapter{实验原理}
\section{基本结构}
\begin{figure}
\centering
\includegraphics[width=\textwidth]{summary.png}
\caption{数据通路的基本结构}
\end{figure}
我们简单介绍一下各部分实现的功能:

\begin{enumerate}
\item IF: 从内存中取指令
\item ID: 转换指令为Opcode，处理立即数,计算PC\\
此处我们将每条指令功能部分转化为我们自己定义的Opcode，原因是方便在产生控制信号的时候进行判断。同时在此阶段根据指令计算出下一个PC，如果遇到跳转而PC无法在此阶段计算出，我们选择暂停的方式来处理。
\item EXE: ALU执行操作,判断零输出。\\
根据Opcode，信号产生器给予ALU信号让其计算后续所需值。
\item MEM: 访存\\
此处内存堆读写控制信号由上一阶段给出。
\item WB: 写回寄存器\\
根据指令将所需值写回寄存器堆。
\item HAZARD DETECTOR: 对各种冲突，暂停条件进行判断，给出其它器件的暂停信号。
\end{enumerate}
其中以上每阶段中都含有一个独立的控制器来对此阶段中的各个控制信号进行调度。\\

\section{拓展功能}

除了基本要求之外,我们还实现了若干拓展功能, 我们在此简要描述我们所作的拓展部分:
\begin{enumerate}
\item 数据旁路\\
引入旁路的目的在于直接将某些运算结果直接赋予所需器件，而减少流水线暂停，提高CPU的CPI指标。使用旁路技术可以基本解决数据冲突问题。对控制冲突，我们在ID阶段计算出PC，对无法在ID阶段计算出的PC，我们采用暂停等待的方法。以上的判断以及发出控制信号皆由HAZARD DETECTOR完成。对结构冲突，我们采取在内存堆读写时暂停等待的方法，以上功能也是由HAZARD DETECTOR来完成的。

\item 中断处理\\
我们实现了软、硬、时钟三种中断，对三种中断其触发方式不同为最大区别，我们在IF/ID段间寄存器之前设一个中断处理装置来处理各种中断，与其他部分无关。

\item 指令缓存\\
由于在我们的实验中访存的时间开销与CPU频率相同，我们设计的指令缓存的作用是与现在的计算机完全不一样的。我们数据缓存的目的并不是一次从内存中读出一段内容来节省时间，而是通过缓存一部分指令，减少结构冲突发生的概率，这在处理程序的循环结构中非常有用。

\item 进程分时\\
我们通过利用时钟中断来实现多进程分时，为此我们修改了Kernel程序以支持多进程执行的功能。

\item 双机通信\\
为了演示进程分时的效果，我们实现了简单的双机通信功能，测试时我们通过串口1和串口2向两台电脑分别发送A和B，两台电脑能够同时分别显示A和B。
\end{enumerate}

为了调试方便，我们还修改了Terminal程序，使之支持二进制程序的载入功能。

